package pe.com.bbva.modpre.persistencia.hibernate;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.ExcepcionDuracionCf;
import pe.com.bbva.modpre.persistencia.ExcepcionDuracionCfDAO;
import pe.com.bbva.modpre.utileria.Busqueda;
import pe.com.bbva.modpre.utileria.ModpreUtil;

@Repository
@SuppressWarnings("serial")
public class ExcepcionDuracionCfHibernate extends BaseHibernate<ExcepcionDuracionCf, Long> 
implements ExcepcionDuracionCfDAO {
	
	@Autowired
	public ExcepcionDuracionCfHibernate(SessionFactory sessionFactory){
		setSessionFactory(sessionFactory);
	}

	@Override
	public ExcepcionDuracionCf obtenerExcepcionDuracionCf(
			ExcepcionDuracionCf excepcionDuracionCf) {
		return obtenerHql("select e from ExcepcionDuracionCf e " +
				"where codigoProducto=? and moneda=? and ? between mayorOIgual and menorOIgual", 
				excepcionDuracionCf.getCodigoProducto(), excepcionDuracionCf.getMoneda(),
				excepcionDuracionCf.getMenorOIgual());
	}

	@Override
	public List<ExcepcionDuracionCf> buscarExcepcionDuracionCfs(
			Map<String, Object> map) {
		Busqueda filtro = Busqueda.forClass(ExcepcionDuracionCf.class);
		if (map != null) {
			if(StringUtils.isNotBlank((String)map.get("codigoProducto"))){
				filtro.add(Restrictions.ilike("codigoProducto",
						(String)map.get("codigoProducto"), MatchMode.ANYWHERE));
			}
			if(StringUtils.isNotBlank((String)map.get("moneda"))){
				filtro.add(Restrictions.ilike("moneda",
						(String)map.get("moneda"), MatchMode.ANYWHERE));
			}
			if(NumberUtils.isNumber((String)map.get("mayorOIgual_1")) && 
					NumberUtils.isNumber((String)map.get("mayorOIgual_2"))){
				filtro.add(Restrictions.between("mayorOIgual", 
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("mayorOIgual_1")),
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("mayorOIgual_2"))));
			}
			if(NumberUtils.isNumber((String)map.get("menorOIgual_1")) && 
					NumberUtils.isNumber((String)map.get("menorOIgual_2"))){
				filtro.add(Restrictions.between("menorOIgual", 
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("menorOIgual_1")),
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("menorOIgual_2"))));
			}
			if(NumberUtils.isNumber((String)map.get("asignarPlazo_1")) && 
					NumberUtils.isNumber((String)map.get("asignarPlazo_2"))){
				filtro.add(Restrictions.between("asignarPlazo", 
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("asignarPlazo_1")),
						ModpreUtil.convertirObjetoBigDecimal((String)map.get("asignarPlazo_2"))));
			}
		}
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}

}
